'use strict'
import OSS from 'ali-oss'
import serring from '@/config'
const { region, accessKeyId, accessKeySecret, bucket, ossUrl } = serring

function dateFormat(dateObj: any, format: string) {
  const date: any = {
    'M+': dateObj.getMonth() + 1,
    'd+': dateObj.getDate(),
    'h+': dateObj.getHours(),
    'm+': dateObj.getMinutes(),
    's+': dateObj.getSeconds(),
    'q+': Math.floor((dateObj.getMonth() + 3) / 3),
    'S+': dateObj.getMilliseconds()
  }
  if (/(y+)/i.test(format)) {
    format = format.replace(
      RegExp.$1,
      (dateObj.getFullYear() + '').substr(4 - RegExp.$1.length)
    )
  }
  for (const k in date) {
    if (new RegExp('(' + k + ')').test(format)) {
      format = format.replace(
        RegExp.$1,
        RegExp.$1.length === 1
          ? date[k]
          : ('00' + date[k]).substr(('' + date[k]).length)
      )
    }
  }
  return format
}

export default {
  /**
   * 创建随机字符串
   * @param num
   * @returns {string}
   */
  randomString(num: number) {
    const chars = [
      '0',
      '1',
      '2',
      '3',
      '4',
      '5',
      '6',
      '7',
      '8',
      '9',
      'a',
      'b',
      'c',
      'd',
      'e',
      'f',
      'g',
      'h',
      'i',
      'j',
      'k',
      'l',
      'm',
      'n',
      'o',
      'p',
      'q',
      'r',
      's',
      't',
      'u',
      'v',
      'w',
      'x',
      'y',
      'z'
    ]
    let res = ''
    for (let i = 0; i < num; i++) {
      const id = Math.ceil(Math.random() * 35)
      res += chars[id]
    }
    return res
  },

  /**
   * 创建oss客户端对象
   * @returns {*}
   */
  createOssClient() {
    return new Promise(resolve => {
      const client = new OSS({
        region,
        accessKeyId,
        accessKeySecret,
        bucket,
        secure: true
      })
      resolve(client)
    })
  },
  /**
   * 文件上传
   * @param option 参考csdn: https://blog.csdn.net/qq_27626333/article/details/81463139
   */
  ossUploadFile(option: any) {
    const file = option.file.file
    return new Promise((resolve, reject) => {
      const date = dateFormat(new Date(), 'yyyyMMdd') // 当前时间
      const dateTime = dateFormat(new Date(), 'yyyyMMddhhmmss') // 当前时间
      const randomStr = this.randomString(4) //  4位随机字符串
      const extensionName = file.name.substr(file.name.indexOf('.')) // 文件扩展名
      const fileName =
        'image/' + date + '/' + dateTime + '_' + randomStr + extensionName // 文件名字（相对于根目录的路径 + 文件名）
      // 执行上传
      this.createOssClient().then((client: any) => {
        // 异步上传,返回数据
        resolve({
          baseUrl: ossUrl,
          fileName: file.name,
          fileUrl: fileName
        })
        // 上传处理
        // 分片上传文件
        client
          .multipartUpload(fileName, file, {
            progress: function (p: number) {
              const e: any = {}
              e.percent = Math.floor(p * 100)
              option.onProgress(e)
            }
          })
          .then(
            (val: any) => {
              if (val.res.statusCode === 200) {
                option.file.thumbnailUrl = ossUrl + val.name
                option.file.url = ossUrl + val.name
                option.onFinish()
                return val
              } else {
                option.onError('上传失败')
              }
            },
            (err: any) => {
              option.onError('上传失败')
              reject(err)
            }
          )
          .catch((err: any) => {
            console.log(err)
          })
      })
    })
  },
  ossUploadBlob(option: any) {
    const file = option.file
    return new Promise((resolve, reject) => {
      const date = dateFormat(new Date(), 'yyyyMMdd') // 当前时间
      const dateTime = dateFormat(new Date(), 'yyyyMMddhhmmss') // 当前时间
      const randomStr = this.randomString(4) //  4位随机字符串
      const extensionName = file.name.substr(file.name.indexOf('.')) // 文件扩展名
      const fileName =
        'images/' + date + '/' + dateTime + '_' + randomStr + extensionName // 文件名字（相对于根目录的路径 + 文件名）
      // 执行上传
      this.createOssClient().then((client: any) => {
        client.multipartUpload(fileName, file, {}).then(
          (val: any) => {
            // console.info(val)
            if (val.res.statusCode === 200) {
              resolve({
                name: file.name,
                url: ossUrl + val.name
              })
            } else {
              console.log('上传失败')
            }
          },
          (err: any) => {
            reject(err)
          }
        )
      })
    })
  }
}
